/*学习不定参宏函数的使用*/

#include <stdio.h>

#define LOG(fmt, ...) printf("[%s:%d]" fmt, __FILE__, __LINE__, ##__VA_ARGS__)

// int main()
// {
//     // printf("[%s:%d] %s-%d\n", __FILE__, __LINE__, "hello", 666);
//     LOG("%s\n", "hello");
//     return 0;
// }


/*C语言中不定参函数的使用，不定参数据的访问*/
// #define _GNU_SOURCE
#include <stdio.h> 
#include <stdlib.h>
#include <stdarg.h>

void printNum(int count, ...){
    va_list ap;
    va_start(ap, count);// 获取指定参数的起始地址，获取count之后第一个参数的起始地址
    for (int i = 0; i < count; i++)
    {
        int num = va_arg(ap, int);// 获取下一个参数，参数类型必须指定
        printf("%d\n", num);
    }
    va_end(ap);// 将ap指针置空
}

void myprintf(const char *fmt, ...)
{
    va_list ap;
    va_start(ap, fmt);
    char *buf;
    int ret = vasprintf(&buf, fmt, ap);
    if (ret != -1)
    {
        printf("%s", buf);
        free(buf);
    }
    va_end(ap);
}

// int main()
// {
//     printNum(3, 100, 200, 300);
//     printNum(5, 1, 2, 3, 4, 5);
//     myprintf("hello %s %d\n", "world", 666);
//     return 0;
// }

/*C++风格的不定参函数*/
#include <iostream>

void xprintf()
{
    std::cout << std::endl;
}

template<typename T, typename... Args>
void xprintf(const T &v, Args &&...args)
{
    std::cout << v;
    if(sizeof...(args) > 0){
        xprintf(std::forward<Args>(args)...);
    }else{
        xprintf();
    }
}

int main()
{
    xprintf("hello ", "world ", 666, "\n");
    return 0;
}